package pe.com.bbva.ge.persistencia.orm;

import java.io.Serializable;
import java.util.List;

/**
 * Servicio Generico que cubre las principales transacciones de un CRUD (Create Read Update Delete) 
 * 
 * @author mmelgar
 */
public interface CrudORM extends BaseORM {
	
	/**
	 * Permite crear un nuevo registro según la Entidad enviada.
	 * 
	 * @param entidad
	 */
	<Entidad> void crear(Entidad entidad);
	
	/**
	 * Permite modificar la Entidad enviada.
	 * 	
	 * @param entidad 
	 */
	<Entidad> void modificar(Entidad entidad);

	/**
	 * Permite eliminar la entidad enviada. Esto según la llave definida
	 * 
	 * @param entidad
	 */
	<Entidad> void eliminar(Entidad entidad);

	/**
	 * Permite obtener la Entidad segun el TipoLlave enviado.
	 * 
	 * @param id
	 * @param clase
	 * @return Entidad obtenida. De no encontrar será <code>null</code>
	 */
	<Entidad> Entidad obtener(Serializable id, Class<Entidad> clase);

	/**
	 * Permite grabar las entidades enviadas en la <code>lista</code>. Para las entidades nuevas las registras y para las entidades existientes las modifica.
	 * 
	 * @param lista
	 */
	<Entidad> void grabarTodos(List<Entidad> lista);

	/**
	 * Permite eliminar las entidades de la <code>lista</code>
	 * 
	 * @param lista
	 */
	<Entidad> void eliminarTodos(List<Entidad> lista);

	/**
	 * <p>Obtiene <b>todas</b> las entidades de la BBDD</p>
	 * 
	 * @param clase
	 * @return Lista de Entidades
	 */
	<Entidad> List<Entidad> obtenerTodos(Class<Entidad> clase);
	
	/**
	 * <p>Obtiene <b>todas</b> las entidades activas de la BBDD</p>
	 * 
	 * @param clase
	 * @return Lista de Entidades
	 */
	<Entidad> List<Entidad> obtenerActivos(Class<Entidad> clase);

	/**
	 * Obtiene la cantidad de registros de la entidades en BBDD
	 * 
	 * @param clase
	 * @return Total de Entidades
	 */
	<Entidad> long contar(Class<Entidad> clase);

}
